home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / graphics / chs_ultd.lzh / CHS_ULTD.500 / SOURCE / FEIGBAUM.C < prev    next >
C/C++ Source or Header  |  1992-09-25  |  22KB  |  704 lines

  1. #include "..\xcommon.h"
  2. #include "..\chs_ultd\feigenbm.h"
  3. #include <math.h>
  4. #include <tos.h>
  5. #include <string.h>
  6.  
  7. int errno;                /* damit der linker nicht motzt;
  8.                             sonst in pc_start deklariert */
  9.  
  10. extern    XCHAOS xfch;        /* die definition kommt weiter unten */
  11. int        fgbm_nr;            /* nummer der routine in chaos */
  12.  
  13. COMMON    *common;            /* zeiger für die routinen von chaos */
  14.  
  15. /*------------------------------------------------------------------------------
  16.         initialisierungsroutine,
  17.             muß nach linken am anfang des text-segmentes stehen,
  18.             d.h. im quelltext ganz vorne
  19. ------------------------------------------------------------------------------*/
  20. XCHAOS *ret_chaos(COMMON *com)
  21. {
  22.     common=com;                /* merke com */
  23.     return &xfch;                /* gib eigene routinen zurück */
  24. }
  25.  
  26. /*------------------------------------------------------------------------------
  27.  
  28.     parameterstrukturen
  29.  
  30. ------------------------------------------------------------------------------*/
  31. /*
  32.         bildparameter
  33. */
  34. typedef struct
  35. {
  36.     int flag;                /* 0 quer, 1 hoch */
  37.  
  38.     int n1;                /* iterationen vor plot */
  39.     int n2;                /* iterationen für plot */
  40.     int dn;                /* iterationen zwischen zwei plot's */
  41.  
  42.     long time;            /* rechenzeit */
  43.  
  44.     double r_min;            /* definition des rechteckes */
  45.     double r_max;
  46.     double y_min;
  47.     double y_max;
  48.  
  49.     double y0;            /* startwert für iteration */
  50.  
  51. } FEIGENBAUM;
  52.  
  53. /*
  54.         bild(er)parameter für neu bilder
  55. */
  56. typedef struct
  57. {
  58.     FEIGENBAUM start;        /* parameter des ersten bildes */
  59.     FEIGENBAUM end;        /* parameter des letzten bildes */
  60.     int change[8];            /* interpolationstypen */
  61.     FEIGENBAUM act;        /* speicherplatz für parameter des aktuellen bildes */
  62. } FGBM_PAR;
  63.  
  64. /*
  65.         einstellungen
  66. */
  67. typedef struct
  68. {
  69.     int set;
  70.     FEIGENBAUM start;
  71.     FEIGENBAUM end;
  72.     int change[8];
  73.     int size;
  74.     int anzahl;
  75.     int color;
  76.     char name[10];
  77. } FGBM_SET;
  78.  
  79.  
  80. /*------------------------------------------------------------------------------
  81.  
  82.     globale variable
  83.  
  84. ------------------------------------------------------------------------------*/
  85. static OBJECT *fg_par_ad,*fg_show_ad,*icons;    /* dialogboxen */
  86. FGBM_SET fgbm_set;                        /* einstellungen */
  87.  
  88. /*------------------------------------------------------------------------------
  89.  
  90.         parameter einlesen
  91.  
  92. ------------------------------------------------------------------------------*/
  93. /*
  94.         schreibe standartvoreinstellungen nach set
  95. */
  96. static void def_fgparam(FGBM_SET *set)
  97. {
  98. int i;
  99. static FEIGENBAUM def_start={0,100,100,1,0l,
  100.                         2.0,4.0,0.0,1.0,0.5};
  101.     set->start=def_start;
  102.     set->end=def_start;
  103.  
  104.     for ( i=0; i<8; i++ )
  105.         set->change[i]=1;
  106.  
  107.     set->anzahl=1;        /* 1 bild */
  108.     set->size=S_BIG;    /* große bilder */
  109.     set->color=0;        /* normal */
  110.     strcpy(set->name,"FGBAUM");
  111. }
  112.  
  113. /*
  114.         indizes der dialogbox-elemente
  115. */
  116.         /* interpolations-typen */
  117. static char *ch_txt[]={"-","0","+"};
  118.         /* button für interpolation */
  119. static int fb_ch[]={FB_RMIN,FB_RMAX,FB_XMIN,FB_XMAX,FB_X0,FB_N1,FB_N2,FB_DN};
  120.         /* tedinfo's der start-parameter */
  121. static int fb_1[]={FB_RMIN1,FB_RMAX1,FB_XMIN1,FB_XMAX1,FB_X0_1,FB_N1_1,FB_N2_1,FB_DN_1};
  122.         /* tedinfo's der end-parameter */
  123. static int fb_2[]={FB_RMIN2,FB_RMAX2,FB_XMIN2,FB_XMAX2,FB_X0_2,FB_N1_2,FB_N2_2,FB_DN_2};
  124.  
  125. /*
  126.         belege dialogbox vor
  127. */
  128. static void set_fgparam(FGBM_SET *set,FGBM_PAR *fgbm)
  129. {
  130. int i;
  131.  
  132.     if ( !set->set )    /* keine einstellungen? -> standartvoreinstellungen */
  133.         def_fgparam(set);
  134.  
  135.     strcpy(objc_tedstr(fg_par_ad,FB_NAME),set->name);            /* objektname */
  136.     common->sprintf(objc_tedstr(fg_par_ad,FB_ANZ),"%4d",set->anzahl);    /* anzahl */
  137.     objc_unselect(fg_par_ad,FB_SMALL);                        /* größe */
  138.     objc_unselect(fg_par_ad,FB_MED);
  139.     objc_unselect(fg_par_ad,FB_BIG);
  140.     objc_select(fg_par_ad,FB_SMALL+set->size);
  141.  
  142.                                             /* parameter links */
  143.     common->write_dbl(objc_tedstr(fg_par_ad,FB_RMIN1),set->start.r_min,15,11);
  144.     common->write_dbl(objc_tedstr(fg_par_ad,FB_RMAX1),set->start.r_max,15,11);
  145.     common->write_dbl(objc_tedstr(fg_par_ad,FB_XMIN1),set->start.y_min,15,11);
  146.     common->write_dbl(objc_tedstr(fg_par_ad,FB_XMAX1),set->start.y_max,15,11);
  147.     common->write_dbl(objc_tedstr(fg_par_ad,FB_X0_1),set->start.y0,15,11);
  148.     common->sprintf(objc_tedstr(fg_par_ad,FB_N1_1),"%4d",set->start.n1);
  149.     common->sprintf(objc_tedstr(fg_par_ad,FB_N2_1),"%4d",set->start.n2);
  150.     common->sprintf(objc_tedstr(fg_par_ad,FB_DN_1),"%3d",set->start.dn);
  151.  
  152.                                             /* parameter rechts */
  153.     common->write_dbl(objc_tedstr(fg_par_ad,FB_RMIN2),set->end.r_min,15,11);
  154.     common->write_dbl(objc_tedstr(fg_par_ad,FB_RMAX2),set->end.r_max,15,11);
  155.     common->write_dbl(objc_tedstr(fg_par_ad,FB_XMIN2),set->end.y_min,15,11);
  156.     common->write_dbl(objc_tedstr(fg_par_ad,FB_XMAX2),set->end.y_max,15,11);
  157.     common->write_dbl(objc_tedstr(fg_par_ad,FB_X0_2),set->end.y0,15,11);
  158.     common->sprintf(objc_tedstr(fg_par_ad,FB_N1_2),"%4d",set->end.n1);
  159.     common->sprintf(objc_tedstr(fg_par_ad,FB_N2_2),"%4d",set->end.n2);
  160.     common->sprintf(objc_tedstr(fg_par_ad,FB_DN_2),"%3d",set->end.dn);
  161.  
  162.                                             /* interpolationstypen */
  163.     for( i=0; i<8; i++ ) {
  164.         objc_spec(fg_par_ad,fb_ch[i])=ch_txt[set->change[i]];
  165.         fgbm->change[i]=set->change[i];
  166.     }
  167.  
  168.                                             /* bildtyp: normal/quer */
  169.     objc_select(fg_par_ad,FB_NRM+set->start.flag);
  170.     objc_unselect(fg_par_ad,FB_QUR-set->start.flag);
  171.  
  172.                                             /* darstellung (normal/invers) */
  173.     objc_unselect(fg_par_ad,FB_INV+set->color);
  174.     objc_select(fg_par_ad,FB_NORM-set->color);
  175. }
  176.  
  177. /*
  178.         parameter aus dialogbox auslesen
  179. */
  180. static int get_fgparam(FGBM_PAR *param,X_PARAM *x_param)
  181. {
  182.     x_param->xor_offset=0;                                /* kein xor offset, xor bringt eh nichts */
  183.  
  184.     strcpy(x_param->name,objc_tedstr(fg_par_ad,FB_NAME));        /* name */
  185.     common->sscanf(objc_tedstr(fg_par_ad,FB_ANZ),"%d",&x_param->anzahl);/* anzahl */
  186.     if ( objc_selected(fg_par_ad,FB_SMALL) )                /* größe */
  187.         x_param->size=S_SMALL;
  188.     else if ( objc_selected(fg_par_ad,FB_MED) )
  189.         x_param->size=S_MID;
  190.     else
  191.         x_param->size=S_BIG;
  192.                                                 /* startparameter */
  193.     common->sscanf(objc_tedstr(fg_par_ad,FB_RMIN1),"%lf",¶m->start.r_min);
  194.     common->sscanf(objc_tedstr(fg_par_ad,FB_RMAX1),"%lf",¶m->start.r_max);
  195.     if ( param->start.r_min>param->start.r_max )
  196.         return FB_RMIN1;
  197.     common->sscanf(objc_tedstr(fg_par_ad,FB_XMIN1),"%lf",¶m->start.y_min);
  198.     common->sscanf(objc_tedstr(fg_par_ad,FB_XMAX1),"%lf",¶m->start.y_max);
  199.     if ( param->start.y_min>param->start.y_max )
  200.         return FB_XMIN1;
  201.     common->sscanf(objc_tedstr(fg_par_ad,FB_X0_1),"%lf",¶m->start.y0);
  202.     common->sscanf(objc_tedstr(fg_par_ad,FB_N1_1),"%d",¶m->start.n1);
  203.     common->sscanf(objc_tedstr(fg_par_ad,FB_N2_1),"%d",¶m->start.n2);
  204.     common->sscanf(objc_tedstr(fg_par_ad,FB_DN_1),"%d",¶m->start.dn);
  205.  
  206.                                                 /* endparameter */
  207.     common->sscanf(objc_tedstr(fg_par_ad,FB_RMIN2),"%lf",¶m->end.r_min);
  208.     common->sscanf(objc_tedstr(fg_par_ad,FB_RMAX2),"%lf",¶m->end.r_max);
  209.     if ( x_param->anzahl>1 && param->end.r_min>param->end.r_max )
  210.         return FB_RMIN2;
  211.     common->sscanf(objc_tedstr(fg_par_ad,FB_XMIN2),"%lf",¶m->end.y_min);
  212.     common->sscanf(objc_tedstr(fg_par_ad,FB_XMAX2),"%lf",¶m->end.y_max);
  213.     if ( x_param->anzahl>1 && param->end.y_min>param->end.y_max )
  214.         return FB_XMIN2;
  215.     common->sscanf(objc_tedstr(fg_par_ad,FB_X0_2),"%lf",¶m->end.y0);
  216.     common->sscanf(objc_tedstr(fg_par_ad,FB_N1_2),"%d",¶m->end.n1);
  217.     common->sscanf(objc_tedstr(fg_par_ad,FB_N2_2),"%d",¶m->end.n2);
  218.     common->sscanf(objc_tedstr(fg_par_ad,FB_DN_2),"%d",¶m->end.dn);
  219.  
  220.     /* interpolationstypen stehen schon in param->change[] ! */
  221.  
  222.     if ( objc_selected(fg_par_ad,FB_QUR) )                    /* bildtyp */
  223.         param->start.flag=1;
  224.     else
  225.         param->start.flag=0;
  226.  
  227.     if ( objc_selected(fg_par_ad,FB_INV) )                    /* farbe */
  228.         x_param->color=1;
  229.     else
  230.         x_param->color=0;
  231.  
  232.     param->start.time=0l;                                /* zeit auf null setzen */
  233.  
  234.     return 0;
  235. }
  236.  
  237. /*
  238.         parameter / block aus objekt
  239. */
  240. int get_fgbm_objc(int side)
  241.     /* side    FB_GET1 = linke, FB_GET2 = rechte parameterspalte */
  242.     /*         FB_BLK1,         FB_BLK2 -> block */
  243. {
  244. int *objcs;
  245. FR_OBJC *object;
  246. FEIGENBAUM *fgbm;
  247. double x_min,x_max,y_min,y_max;
  248.  
  249.     if ( side==FB_GET1 |